package com.alinesno.cloud.initializr.starter.codegen.util;

import java.util.Arrays;

import org.apache.commons.lang3.RegExUtils;

import com.alinesno.cloud.initializr.starter.codegen.config.GenConfig;
import com.alinesno.cloud.initializr.starter.codegen.constant.GenConstants;
import com.alinesno.cloud.initializr.starter.codegen.entity.GenTable;
import com.alinesno.cloud.initializr.starter.codegen.entity.GenTableColumn;
import com.alinesno.cloud.initializr.starter.codegen.utils.GenStringUtils;

/**
 * 代码生成器 工具类
 *
 * @author ruoyi
 */
public class GenUtils {

    public static void initTable(GenTable genTable, String operName) {
        initTable(genTable, operName, null, null);
    }

    /**
     * 初始化表信息
     */
    public static void initTable(GenTable genTable, String operName, String packageName, String author) {

        if (StringUtils.isBlank(packageName)) {
            packageName = GenConfig.getPackageName();
        }

        if (StringUtils.isBlank(author)) {
            author = GenConfig.getAuthor();
        }

        genTable.setClassName(convertClassName(genTable.getTableName()));
        genTable.setPackageName(packageName);
        genTable.setModuleName(getModuleName(packageName));
//        genTable.setBusinessName(getBusinessName(genTable.getTableName()));
//		genTable.setBusinessName(genTable.get());
        genTable.setFunctionName(replaceText(genTable.getTableComment()));
        genTable.setFunctionName(replaceText(genTable.getTableComment()));
        genTable.setFunctionAuthor(author);

        genTable.setCreateBy(operName);
    }

    /**
     * 初始化列属性字段
     */
    public static void initColumnField(GenTableColumn column, GenTable table) {
        String dataType = getDbType(column.getColumnType());
        String columnName = column.getColumnName();
        column.setTableId(table.getTableId());
        column.setCreateBy(table.getCreateBy());
        // 设置java字段名
        column.setJavaField(GenStringUtils.toCamelCase(columnName));
        // 设置默认类型
        column.setJavaType(GenConstants.TYPE_STRING);
        // 设置默认前端控件类型
        column.setHtmlType(GenConstants.HTML_INPUT);
        // 设置默认查询类型
        column.setQueryType(GenConstants.QUERY_LIKE);
        // 设置默认都要必填
        column.setIsRequired(GenConstants.REQUIRE);


        if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType)
                || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) {

            // 字符串长度超过500设置为文本域
            Integer columnLength = getColumnLength(column.getColumnType());

            // 设置字段的长
            column.setColumnLength(columnLength + "");

            String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)
                    ? GenConstants.HTML_TEXTAREA
                    : GenConstants.HTML_INPUT;
            column.setHtmlType(htmlType);

        } else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) {

            column.setJavaType(GenConstants.TYPE_DATE);
            column.setHtmlType(GenConstants.HTML_DATETIME);

        } else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) {
            column.setHtmlType(GenConstants.HTML_INPUT);

            // 如果是浮点型 统一用BigDecimal
            String[] str = GenStringUtils.split(GenStringUtils.substringBetween(column.getColumnType(), "(", ")"), ",");
            if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) {
                column.setJavaType(GenConstants.TYPE_BIGDECIMAL);

                // 设置字段的长
                column.setColumnLength(str[0] + "");
                column.setDecimalColumnLength(str[1] + "");
            }

            // 如果是整形
            else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) {

                // 设置字段的长
                column.setColumnLength(str[0] + "");

                column.setJavaType(GenConstants.TYPE_INTEGER);
            }
            // 长整形
            else {
                column.setJavaType(GenConstants.TYPE_LONG);
            }
        }

        // 特殊字段长度处理
        if (column.getColumnLength() == null) {

            if (dataType.contains(GenConstants.TYPE_ENUM)) {
                // 设置字段的长
                column.setColumnLength("1");
            } else {
                // 字符串长度超过500设置为文本域
                Integer columnLength = getColumnLength(column.getColumnType());

                // 设置字段的长
                column.setColumnLength(columnLength + "");
            }

        }

        // 插入字段（默认所有字段都需要插入）
        column.setIsInsert(GenConstants.REQUIRE);

        // 编辑字段
        if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName) && !column.isPk()) {
            column.setIsEdit(GenConstants.REQUIRE);
        }
        // 列表字段
        if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName) && !column.isPk()) {
            column.setIsList(GenConstants.REQUIRE);
        }
        // 查询字段
        if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk()) {
            column.setIsQuery(GenConstants.REQUIRE);
        }

//        // 查询字段类型
//        if (StringUtils.endsWithIgnoreCase(columnName, "name"))
//        {
//            column.setQueryType(GenConstants.QUERY_LIKE);
//        }
//        // 状态字段设置单选框
//        if (StringUtils.endsWithIgnoreCase(columnName, "status"))
//        {
//            column.setHtmlType(GenConstants.HTML_RADIO);
//        }
//        // 类型&性别字段设置下拉框
//        else if (StringUtils.endsWithIgnoreCase(columnName, "type")
//                || StringUtils.endsWithIgnoreCase(columnName, "sex"))
//        {
//            column.setHtmlType(GenConstants.HTML_SELECT);
//        }
//        // 文件字段设置上传控件
//        else if (StringUtils.endsWithIgnoreCase(columnName, "file"))
//        {
//            column.setHtmlType(GenConstants.HTML_UPLOAD);
//        }
//        // 内容字段设置富文本控件
//        else if (StringUtils.endsWithIgnoreCase(columnName, "content"))
//        {
//            column.setHtmlType(GenConstants.HTML_SUMMERNOTE);
//        }
    }

    /**
     * 校验数组是否包含指定值
     *
     * @param arr         数组
     * @param targetValue 值
     * @return 是否包含
     */
    public static boolean arraysContains(String[] arr, String targetValue) {
        return Arrays.asList(arr).contains(targetValue);
    }

    /**
     * 获取模块名
     *
     * @param packageName 包名
     * @return 模块名
     */
    public static String getModuleName(String packageName) {
        int lastIndex = packageName.lastIndexOf(".");
        int nameLength = packageName.length();
        String moduleName = GenStringUtils.substring(packageName, lastIndex + 1, nameLength);
        return moduleName;
    }

    /**
     * 获取业务名
     *
     * @param tableName 表名
     * @return 业务名
     */
    public static String getBusinessName(String tableName) {
        int lastIndex = tableName.lastIndexOf("_");
        int nameLength = tableName.length();
        String businessName = GenStringUtils.substring(tableName, lastIndex + 1, nameLength);
        return businessName;
    }

    /**
     * 表名转换成Java类名
     *
     * @param tableName 表名称
     * @return 类名
     */
    public static String convertClassName(String tableName) {
        boolean autoRemovePre = GenConfig.getAutoRemovePre();
        String tablePrefix = GenConfig.getTablePrefix();
        if (autoRemovePre && GenStringUtils.isNotEmpty(tablePrefix)) {
            String[] searchList = GenStringUtils.split(tablePrefix, ",");
            tableName = replaceFirst(tableName, searchList);
        }
        return GenStringUtils.convertToCamelCase(tableName);
    }

    /**
     * 批量替换前缀
     *
     * @param replacementm 替换值
     * @param searchList   替换列表
     * @return
     */
    public static String replaceFirst(String replacementm, String[] searchList) {
        String text = replacementm;
        for (String searchString : searchList) {
            if (replacementm.startsWith(searchString)) {
                text = replacementm.replaceFirst(searchString, "");
                break;
            }
        }
        return text;
    }

    /**
     * 关键字替换
     *
     * @param text 需要被替换的名字
     * @return 替换后的名字
     */
    public static String replaceText(String text) {
        return RegExUtils.replaceAll(text, "(?:表|若依)", "");
    }

    /**
     * 获取数据库类型字段
     *
     * @param columnType 列类型
     * @return 截取后的列类型
     */
    public static String getDbType(String columnType) {
        if (GenStringUtils.indexOf(columnType, "(") > 0) {
            return GenStringUtils.substringBefore(columnType, "(");
        } else {
            return columnType;
        }
    }

    /**
     * 获取字段长度
     *
     * @param columnType 列类型
     * @return 截取后的列类型
     */
    public static Integer getColumnLength(String columnType) {
        System.out.println("columnType = " + columnType);
        if (GenStringUtils.indexOf(columnType, "(") > 0) {
            String length = GenStringUtils.substringBetween(columnType, "(", ")");
            if (columnType.startsWith("decimal")) {
                //处理decimal字段类型的字段长度 (10,0)
                length = GenStringUtils.substringBefore(length, ",");
            }
            return Integer.valueOf(length);
        } else {
            return 0;
        }
    }



}